/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
 * contributors by the @authors tag. See the copyright.txt in the
 * distribution for a full listing of individual contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package za.ac.nmmu.muhelp.rest;

import java.util.logging.Logger;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.QueryParam;
import javax.ws.rs.PUT;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Message;

import za.ac.nmmu.muhelp.util.StringUtilities;
import za.ac.nmmu.muhelp.comms.Connection;
import za.ac.nmmu.muhelp.data.XMPPConfigurationRepository;
import za.ac.nmmu.muhelp.model.XMPPConfiguration;

//
// this is a dummy rest application which pretends
// to be a proper Application Thing
//
@Path("/receive")
@RequestScoped
public class ReceiveMessageRESTService {

    @Inject
    private Logger log;

    @Inject
    private Map<String, Connection> connections;


    @Inject
    XMPPConfigurationRepository xmppConfigurationRepository;

    @PUT
    @Produces( {"text/plain"} )
    public String receive( @DefaultValue("") String st ) {
	try {
		ObjectMapper objectMapper = new ObjectMapper();
		JsonNode jsonNode = objectMapper.readTree(st);
		String to = StringUtilities.truncateChatAddress(jsonNode.get("to").asText());
		String from = StringUtilities.truncateChatAddress(jsonNode.get("from").asText());
		String body = jsonNode.get("body").asText();

		log.info("to: " + to);
		log.info("from: " + from);
		log.info("body: " + body);
		log.info("connections has " + connections.size() );

		XMPPConfiguration incomingXMPPConfiguration = xmppConfigurationRepository.findLiveByUsername(to);
		log.info(incomingXMPPConfiguration.getName() + " " + incomingXMPPConfiguration.getUsername() + " " +
			incomingXMPPConfiguration.getRole().getName());

		XMPPConnection xmppConnection = connections.get(to).getXMPPConnection();

		Message reply = new Message(from, Message.Type.chat);
		if ( incomingXMPPConfiguration.getRole().getName().equals("controller") ) {
			reply.setBody("are you ready to tutor " + from + "?");
		}
		else {
			reply.setBody(body.toUpperCase());
		}

		xmppConnection.sendPacket(reply);
		log.info("packet should be sent");
	}
	catch ( Throwable t ) {
		log.info("throwing " + t);
	}
	return "receive executed";
    }

}

